提醒:由於看到這系列鐵人訂閱人數漸漸變多,標記一下這些內容是在「非常萌新時期」所寫,更多技術內容請參考我的 Github,歡迎跟我一起討論 ^ ^
今天的任務是使用 Express Router middleware 來建立 Routes。
有了上一篇的經驗後,今天一樣直接先跳到後半段,先照著步驟建置好 Routes,再回頭來學習 Express Router middleware 的基本用法。
catalog/
:首頁。catalog/<objects>/
: 每個 model 的目錄頁面catalog/<object>/<id>
:每個 instance 的詳細資訊頁面catalog/<object>/create
:對特定 model 建立新的 instance 的頁面catalog/<object>/<id>/update
:對特定 instance 進行更新的頁面catalog/<object>/<id>/delete
:刪除特定 instance 的頁面// 先輸入models用以溝通database
const Book = require('../models/book')
// bookController多輸出一個index與首頁配對
exports.index = (req, res) => {res.send('Home Page')}
// 分別輸出一個callback以配對上述列出的URL
exports.book_list = (req, res) => {res.send('Book list')}
exports.book_detail = (req, res) => {res.send('Book detail: ' + req.params.id)}
exports.book_create_get = (req, res) => {res.send('Book create GET')}
exports.book_create_post = (req, res) => {res.send('Book create POST')}
exports.book_delete_get = (req, res) => {res.send('Book delete GET')}
exports.book_delete_post = (req, res) => {res.send('Book delete POST')}
exports.book_update_get = (req, res) => {res.send('Book update GET')}
exports.book_update_post = (req, res) => {res.send('Book update POST')}
// 先輸入express,並定義 router 方法
const express = require('express')
const router = express.Router()
// 輸入 Controller,以建立每個 URL 與配對的 callback 連結
const bookController = require('../controllers/bookController')
// 建立routes----------------
// 首頁不會被變更,因此只需get
router.get('/', bookController.index)
// 注意此項必須在'/book/:id'前設置,否則會以為是要開啟id='create'。
router.get('/book/create', bookController.book_create_get)
router.post('/book/create', bookController.book_create_post)
// 可使用 :id 當變數,客製化不同 id 的 URL
router.get('/book/:id/delete', bookController.book_delete_get)
router.post('/book/:id/delete', bookController.book_delete_post)
router.get('/book/:id/update', bookController.book_update_get)
router.post('/book/:id/update', bookController.book_update_post)
router.get('/book/:id', bookController.book_detail)
router.get('/books', bookController.book_list)
// 輸出模組
module.exports = router
redirect()
,使其可自動跳轉到首頁正確的 URL。router.get('/', (req, res) => {
res.redirect('/catalog')
})
const catalogRouter = require('./routes/catalog')
// ...
app.use('/catalog', catalogRouter)
使用 Express Router 來建立 Routes 可以輕易將站點進行分類,並使用 route-prefix 即可進行連結。
Express Router 主要設定三個部分:HTTP verbs(甲)、Route paths(乙)、Route functions(丙)。(請求的類別、路徑、後續動作)
語法:router.甲(乙, 丙)
(對 乙 路徑進行 甲 請求,以 丙 動作作為回應。)
HTTP verbs: Router 提供的方法可以對應到所有的 HTTP verbs,如:get(), post(), put(), delete()等。
例:router.get(乙, 丙)
Route paths:
router.get('/abc', 丙)
?
:前面的字可出現0、1次。+
:前面的字至少出現1次。*
:前面的字可替換成任意字。()
:將一串字組成一個群體,一起套用上述規則。Route functions:
router.get('/abc', (req, res, next) => {res.send('Hi')})
Route parameters:
:userId
、:bookId
會帶入其捕獲的ID,以形成特定的URL。使用建立好的 Route 腳本:
// 輸入腳本
const name = require('腳本所在路徑')
// ...
// 收到指定的URL的 request 時,啟動該腳本
app.use('指定的URL', name)